import resolve from '@rollup/plugin-node-resolve' //告诉Rollup如何查找和导入这些外部模块
import commonjs from '@rollup/plugin-commonjs' //插件允许我们加载第三方模块
import json from '@rollup/plugin-json' //支持导入json，没有 json 插件的支持我们在导入 json 文件时会报错
import alias from '@rollup/plugin-alias' //为模块起别名的功能
import terser from '@rollup/plugin-terser' //进行打包代码压缩。
import serve from 'rollup-plugin-serve' //开启本地服务器
import livereload from 'rollup-plugin-livereload' //开启热更新，实时刷新页面
import eslint from '@rollup/plugin-eslint' //配置eslint插件
import path from 'path'
// import { fileURLToPath } from 'url'
// __filename包含当前模块文件的绝对路径
/**
内部变量:

ES6 模块应该是通用的，同一个模块不用修改，就可以用在浏览器环境和服务器环境。
为了达到这个目标，Node.js 规定 ES6 模块之中不能使用 CommonJS 模块的特有的一些内部变量。

首先，就是this关键字。ES6 模块之中，顶层的this指向undefined；
CommonJS 模块的顶层this指向当前模块，这是两者的一个重大差异。

其次，以下这些顶层变量在 ES6 模块之中都是不存在的。

arguments
require
module
exports
__filename
__dirname

* 通过使用某些函数创建一个自定义__dirname变量来修复“__dirname is not defined in ES module scope”错误。
* 该变量就像全局变量一样工作，直接包含文件当前工作的完整路径。
* __dirname包含当前模块文件目录的绝对路径。
*/
// console.log('__filename', __filename)
const __dirname = path.dirname(__filename);

const pathResolve = (p) => path.resolve(__dirname, p);
// const __filename = fileURLToPath(import.meta.url)
const NODE_ENV = process.env.NODE_ENV // 环境变量
const isProd = NODE_ENV === 'production'
let envPlugins = []
if (isProd) {
  envPlugins = [terser()]
} else {
  envPlugins = [
    eslint({
      include: ['src/**/*.js'], // 需要检查的部分
    }),
    serve({
      open: true, // 是否打开浏览器
      contentBase: './', // 入口 html 文件位置
      historyApiFallback: true, // 设置为 true 返回 index.html 而不是 404
      host: 'localhost', //
      port: 3000, // 端口号
    }),
    livereload(),
    commonjs({
      include: /node_modules/,
    }),
    alias({
      resolve: ['.jsx', '.js'], // 可选，默认情况下这只会查找 .js 文件或文件夹
      entries: {
        '@': pathResolve('src'),
        _: __dirname,
      },
    }),
    json(),
    terser(),
    resolve(),
  ]
}

export default {
  input: './src/main.js', // 入口文件
  output: {
    file: './dist/bundle.js', // 输出文件
    format: 'es', // 输出格式 amd / es / cjs / iife / umd / system
    name: 'func', // 当format为iife和umd时必须提供，将作为全局变量挂在window(浏览器环境)下：window.A=...
    sourcemap: true, // 生成bundle.js.map文件，方便调试
  },
  external: ['lodash'], //不想第三方库被打包进
  plugins: [...envPlugins],
}
